<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>运算器数据通路实验 :: 计算机组成原理实验指导</title>
    <link rel="prev" href="op-compare.html">
    <link rel="next" href="mem-rom.html">
    <meta name="generator" content="Antora 3.2.0-alpha.8">
    <link rel="stylesheet" href="../../_/css/site.css">
<!--    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script> -->
  </head>
  <body class="article">
<header class="header">
  <nav class="navbar">
    <div class="navbar-brand">
      <a class="navbar-item" href="../..">计算机组成原理实验指导</a>
      <button class="navbar-burger" aria-controls="topbar-nav" aria-expanded="false" aria-label="Toggle main menu">
        <span></span>
        <span></span>
        <span></span>
      </button>
    </div>
    <div id="topbar-nav" class="navbar-menu">
      <div class="navbar-end">

        <div class="navbar-item">
          <span class="control">
            <a class="button is-primary" href="https://gitee.com/fpga-lab/digisimlab-open" target="_blank">Download</a>
          </span>
        </div>
      </div>
    </div>
  </nav>
</header>
<div class="body">
<div class="nav-container" data-component="digisimlab" data-version="">
  <aside class="nav">
    <div class="panels">
<div class="nav-panel-menu is-active" data-panel="menu">
  <nav class="nav-menu">
    <button class="nav-menu-toggle" aria-label="Toggle expand/collapse all" style="display: none"></button>
    <h3 class="title"><a href="../index.html">计算机组成原理实验指导</a></h3>
<ul class="nav-list">
  <li class="nav-item" data-depth="0">
    <button class="nav-item-toggle"></button>
    <span class="nav-text">Digital仿真软件使用指南</span>
<ul class="nav-list">
  <li class="nav-item" data-depth="1">
    <a class="nav-link" href="../introduce-digitalsim.html">概述</a>
  </li>
  <li class="nav-item" data-depth="1">
    <a class="nav-link" href="../ds-getting-started.html">新手入门</a>
  </li>
  <li class="nav-item" data-depth="1">
    <a class="nav-link" href="../ds-generate-circuit.html">电路生成</a>
  </li>
  <li class="nav-item" data-depth="1">
    <a class="nav-link" href="../ds-test-circuit.html">电路测试</a>
  </li>
  <li class="nav-item" data-depth="1">
    <a class="nav-link" href="../ds-sim-dff.html">时序电路仿真</a>
  </li>
  <li class="nav-item" data-depth="1">
    <a class="nav-link" href="../ds-other-useful.html">几个有用的组件</a>
  </li>
  <li class="nav-item" data-depth="1">
    <a class="nav-link" href="../ds-hierarchical-design.html">层次化设计</a>
  </li>
  <li class="nav-item" data-depth="1">
    <a class="nav-link" href="../ds-parametric-design.html">参数化设计</a>
  </li>
</ul>
  </li>
  <li class="nav-item" data-depth="0">
<ul class="nav-list">
  <li class="nav-item" data-depth="1">
    <button class="nav-item-toggle"></button>
    <span class="nav-text">逻辑电路基础</span>
<ul class="nav-list">
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="bl-multiplexer.html">多路选择器实验</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="bl-decoder.html">译码器实验</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="bl-register.html">触发器和寄存器实验</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="bl-counter.html">计数器实验</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="dp-register_file.html">寄存器堆实验</a>
  </li>
</ul>
  </li>
  <li class="nav-item" data-depth="1">
    <button class="nav-item-toggle"></button>
    <span class="nav-text">运算器</span>
<ul class="nav-list">
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="op-add_sub_operation.html">加减运算电路实验</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="op-arithmetic_logic_unit.html">算术逻辑单元实验</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="op-compare.html">比较运算电路实验</a>
  </li>
  <li class="nav-item is-current-page" data-depth="2">
    <a class="nav-link" href="dp-single_cycle_datapath.html">运算器数据通路实验</a>
  </li>
</ul>
  </li>
  <li class="nav-item" data-depth="1">
    <button class="nav-item-toggle"></button>
    <span class="nav-text">存储器</span>
<ul class="nav-list">
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="mem-rom.html">ROM实验</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="mem-ram.html">RAM实验</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="mem-path.html">存储器应用实验</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="mem-path-2.html">存储器数据通路实验</a>
  </li>
</ul>
  </li>
</ul>
  </li>
  <li class="nav-item" data-depth="0">
<ul class="nav-list">
  <li class="nav-item" data-depth="1">
    <button class="nav-item-toggle"></button>
    <span class="nav-text">控制器</span>
<ul class="nav-list">
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="cu-overview.html">概述（指令系统）</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="cu-hardwire_controller-1.html">硬布线控制实验（RI）</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="cu-hardwire_controller-3.html">硬布线控制实验（RIM）</a>
  </li>
  <li class="nav-item" data-depth="2">
    <a class="nav-link" href="cu-hardwire_controller.html">硬布线控制实验（RIB）</a>
  </li>
</ul>
  </li>
</ul>
  </li>
</ul>
  </nav>
</div>
<div class="nav-panel-explore" data-panel="explore">
  <div class="context">
    <span class="title">计算机组成原理实验指导</span>
    <span class="version">1.31</span>
  </div>
  <ul class="components">
    <li class="component is-current">
      <div class="title"><a href="../index.html">计算机组成原理实验指导</a></div>
      <ul class="versions">
        <li class="version is-current is-latest">
          <a href="../index.html">1.31</a>
        </li>
        <li class="version">
          <a href="../1.2/index.html">1.2</a>
        </li>
        <li class="version">
          <a href="../1.1/index.html">1.1</a>
        </li>
        <li class="version">
          <a href="../1.0/index.html">1.0</a>
        </li>
      </ul>
    </li>
  </ul>
</div>
    </div>
  </aside>
</div>
<main class="article">
<div class="toolbar" role="navigation">
<button class="nav-toggle"></button>
  <a href="../index.html" class="home-link"></a>
<nav class="breadcrumbs" aria-label="breadcrumbs">
  <ul>
    <li><a href="../index.html">计算机组成原理实验指导</a></li>
    <li>运算器</li>
    <li><a href="dp-single_cycle_datapath.html">运算器数据通路实验</a></li>
  </ul>
</nav>
<div class="page-versions">
  <button class="version-menu-toggle" title="Show other versions of page">1.31</button>
  <div class="version-menu">
    <a class="version is-current" href="dp-single_cycle_datapath.html">1.31</a>
    <a class="version" href="../1.2/lab/dp-single_cycle_datapath.html">1.2</a>
    <a class="version" href="../1.1/lab/dp-single_cycle_datapath.html">1.1</a>
    <a class="version" href="../1.0/lab/dp-single_cycle_datapath.html">1.0</a>
  </div>
</div>
</div>
  <div class="content">
<aside class="toc sidebar" data-title="页内目录" data-levels="2">
  <div class="toc-menu"></div>
</aside>
<article class="doc">
<h1 class="page">运算器数据通路实验</h1>
<div class="sect1">
<h2 id="_实验目的"><a class="anchor" href="#_实验目的"></a>实验目的</h2>
<div class="sectionbody">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>理解单周期数据通路的组成结构。</p>
</li>
<li>
<p>掌握单周期数据通路信息加工过程。</p>
</li>
<li>
<p>锻炼分析问题与解决问题的能力。</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_实验原理"><a class="anchor" href="#_实验原理"></a>实验原理</h2>
<div class="sectionbody">
<div class="paragraph">
<p>计算机本质上是一个加工处理二进制信息的电路，包括ALU、寄存器、存储器等部件，这些部件通过信号线以某种方式连接起来，并且在控制器的控制下，使信息按照一定的规则在各个部件之间有序流动，完成信息的加工处理。这些信息加工部件及信息传递路径的总和就称为<strong>数据通路</strong>。</p>
</div>
<div class="paragraph">
<p>不同结构的数据通路在成本、速度及工作方式上有着较大差异。
总体来说可以分为两种类型：多周期数据通路和单周期数据通路。多周期数据通路完成一次加法运算需要多个时钟周期（如3个周期），而单周期数据通路只需要一个时钟周期就可以完成一次运算处理。
虽然不能单纯以时钟个数的多少来评价性能的优劣，但从发展历史来看，单总线数据通路是早期技术的产物，当时的主要考量是减少连接线的数量、降低成本。
而现代处理器更关注性能，普遍采用流水线结构。
单周期数据通路更有利于演变为流水线结构，所以本实验只考虑单周期数据通路。</p>
</div>
<div class="paragraph">
<p><a href="#fig-dp-1">图 1</a>是一个单周期数据通路的实例，使用了前面实验完成的<a href="op-arithmetic_logic_unit.html" class="xref page">ALU</a>和<a href="dp-register_file.html" class="xref page">三端口寄存器堆</a>。
ALU输入端X的运算数据来自寄存器堆的RD1读端口，另一个输入端Y的运算数据可以来自寄存器堆的RD2读端口，或者来自立即数。
寄存器堆写端口WD的数据来自ALU的运算结果F。
该数据通路可以在一个周期内完成从寄存器堆读数据、ALU运算、运算结果保存到寄存器堆。</p>
</div>
<div id="fig-dp-1" class="imageblock">
<div class="content">
<img src="_images/dp-datapath-1.png" alt="单周期数据通路" width="487" height="350">
</div>
<div class="title">图 1. 单周期数据通路</div>
</div>
<div class="sect2">
<h3 id="bm-dp1-rr"><a class="anchor" href="#bm-dp1-rr"></a>两个寄存器之间的运算</h3>
<div class="paragraph">
<p>下面以两个寄存器间的运算为例，说明数据通路的信息加工过程。
两个寄存器间的运算关系可用下式表示。</p>
</div>
<div class="paragraph text-center">
<p>R[WA] = R[RA1] op R[RA2]</p>
</div>
<div class="paragraph">
<p>式中，R[n]表示编号为n的寄存器的值，op表示ALU进行的运算。</p>
</div>
<div class="paragraph">
<p>信息传递路径如<a href="#fig-dp-2">图 2</a>绿线所示。
两个寄存器的值分别从RD1和RD2读出，为此需要通过RA1和RA2提供寄存器号。
RD1直接连到了ALU的X输入端，但RD2和ALU的Y输入端之间还插入了一个2选1多路器。
因为RD2连接的多路器通道0，为了将RD2送到Y端，需要控制Ys为0，使2选1多路器选择通道0的RD2。
ALU的运算功能由M、S1、S0控制。运算结果F直接作为寄存器堆的写数据WD。
通过前面<a href="dp-register_file.html" class="xref page">寄存器堆实验</a>已经知道，为了将WD数据写入寄存器堆，需要提供欲写入寄存器的寄存器号WA，并且允许写入即WE为1，最后在Clk时钟上升沿的触发下将运算结果写入WA指定的寄存器。</p>
</div>
<div id="fig-dp-2" class="imageblock">
<div class="content">
<img src="_images/dp-datapath-1-3.png" alt="寄存器之间的运算通路" width="487" height="350">
</div>
<div class="title">图 2. 两个寄存器之间的运算通路</div>
</div>
</div>
<div class="sect2">
<h3 id="bm-dp1-ri"><a class="anchor" href="#bm-dp1-ri"></a>寄存器和立即数之间的运算</h3>
<div class="paragraph">
<p>一个寄存器和立即数Imm进行运算的信息传递路径如<a href="#fig-dp-3">图 3</a>所示，其运算关系为</p>
</div>
<div class="paragraph text-center">
<p>R[WA] = R[RA1] op Imm</p>
</div>
<div class="paragraph">
<p>和两个寄存器之间进行运算的主要区别是用立即数Imm取代了寄存器R[RA2]，读者可自行分析信息加工过程。</p>
</div>
<div id="fig-dp-3" class="imageblock">
<div class="content">
<img src="_images/dp-datapath-1-4.png" alt="寄存器和立即数的运算通路" width="487" height="350">
</div>
<div class="title">图 3. 寄存器和立即数之间的运算通路</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="注"></i>
</td>
<td class="content">
和Digital仿真软件不同，<a href="#fig-dp-2">图 2</a>、<a href="#fig-dp-3">图 3</a>绿色导线的深浅并不代表其电平状态，只是为了更直观地表达互不相连的交叉线。
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>特别需要说明的是，如果RA1=0，ALU进行加法运算，则</p>
</div>
<div class="paragraph text-center">
<p>R[WA] = R[0] + Imm</p>
</div>
<div class="paragraph">
<p>又因为R0的值恒为0（见<a href="dp-register_file.html" class="xref page">寄存器堆实验</a>），故</p>
</div>
<div class="paragraph text-center">
<p>R[WA] = Imm</p>
</div>
<div class="paragraph">
<p>也就是将立即数Imm存入由WA指定的寄存器。</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_实验任务"><a class="anchor" href="#_实验任务"></a>实验任务</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_设计任务"><a class="anchor" href="#_设计任务"></a>设计任务</h3>
<div class="paragraph">
<p>用Digital仿真软件按照<a href="#fig-dp-1">图 1</a>绘制电路图。
数据通路的数据位数为4位。
ALU和三端口寄存器堆使用前面实验完成的。</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="提示"></i>
</td>
<td class="content">
<div class="paragraph">
<p>必要时可调整子电路符号的宽度和端口顺序。相关操作参考<a href="../ds-hierarchical-design.html#bm-ds-hier-1" class="xref page">层次化设计 - 子电路图形符号的外观</a>。</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_验证任务"><a class="anchor" href="#_验证任务"></a>验证任务</h3>
<div class="paragraph">
<p>依次完成以下验证任务，分析实验数据，判断结果的正确性。
若结果与预期不符，尝试分析故障现象并排除故障，提升分析问题与解决问题的能力。
最后保存仿真过程数据文件。</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="提示"></i>
</td>
<td class="content">
<div class="paragraph">
<p>为了能够观察到寄存器堆内部每个寄存器的输出，可以通过菜单「仿真 ➤ 显示测量值表格」打开「测量」窗口，该窗口中动态显示设置了「在测量图中显示」或「作为测量值」属性的组件的当前输出值，如寄存器堆内部探测器组件Q1、Q2、Q3的当前值。
也可以采用<a href="../ds-getting-started.html" class="xref page">新手入门</a>中介绍的方法开启「<a href="../ds-getting-started.html#bm-show-measure" class="xref page">显示测量图</a>」，在波形图中观察探测器组件Q1、Q2、Q3的变化。</p>
</div>
</td>
</tr>
</table>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>将非零常数存入寄存器</p>
<div class="paragraph">
<p>开始仿真后所有寄存器的值均为0，需要先向寄存器写入非零数据，才能进行后续的运算。
例如，假设要将常数9存入R2寄存器，则可将常数9通过Imm输入，与R0进行加法运算后结果存入R2寄存器，即完成<code>R[2]=R[0]+9=9</code>。运算过程参考实验原理部分<a href="#bm-dp1-ri">寄存器和立即数之间运算</a>的特例。</p>
</div>
<div class="admonitionblock caution">
<table>
<tr>
<td class="icon">
<i class="fa icon-caution" title="注意"></i>
</td>
<td class="content">
<div class="paragraph">
<p>存入的常数应有助于后续步骤检验实验电路的功能和特性。
例如，应有助于验证数据通路可进行4位二进制运算，有助于检验运算结果的标志位等。</p>
</div>
</td>
</tr>
</table>
</div>
</li>
<li>
<p>完成寄存器和立即数之间的运算并保存运算结果。</p>
<div class="paragraph">
<p>将前面已存入数据的寄存器的内容，通过ALU与Imm给出的常数进行算术、逻辑运算，结果存入另一寄存器。
例如，假设前面已将R2存入数据，将其与Imm进行加法运算后结果存入R3寄存器，即完成<code>R[3]=R[2]+Imm</code>。运算过程参考实验原理部分<a href="#bm-dp1-ri">寄存器和立即数之间的运算</a>。</p>
</div>
</li>
<li>
<p>完成两个寄存器之间的各种运算并保存运算结果。</p>
<div class="paragraph">
<p>将前面已存入数据的2个寄存器的内容，通过ALU进行算术、逻辑运算，结果存入另一寄存器。
例如，假设R2、R3已经存有数据，进行加法运算后结果存入R1寄存器，即完成<code>R[1]=R[2]+R[3]</code>。运算过程参考实验原理部分<a href="#bm-dp1-rr">两个寄存器之间的运算</a>。</p>
</div>
</li>
</ol>
</div>
<div class="sidebarblock text-center">
<div class="content">
<div class="title">许可 | License</div>
<div class="paragraph">
<p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">CC BY-NC-SA：署名-非商业性使用-相同方式共享 4.0 国际许可协议</a></p>
</div>
<div class="paragraph">
<p>作者：
肖铁军 &lt;<a href="mailto:xiaotiejun@foxmail.com.cn">xiaotiejun@foxmail.com.cn</a>&gt;</p>
</div>
</div>
</div>
</div>
</div>
</div>
<nav class="pagination">
  <span class="prev"><a href="op-compare.html">比较运算电路实验</a></span>
  <span class="next"><a href="mem-rom.html">ROM实验</a></span>
</nav>
</article>
  </div>
</main>
</div>
<footer class="footer">
  <p>This page was built using the Antora default UI.</p>
  <p>The source code for this UI is licensed under the terms of the MPL-2.0 license.</p>
</footer>
<script id="site-script" src="../../_/js/site.js" data-ui-root-path="../../_"></script>
<script async src="../../_/js/vendor/highlight.js"></script>
  </body>
</html>
